package br.com.ava.core.editora;

import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

import br.com.ava.core.ConstantesMensagens;
import br.com.ava.core.infra.excecao.NegocioException;
import br.com.ava.core.infra.mensagem.Mensagem;
import br.com.ava.core.infra.persistencia.AbstractMediator;

@SuppressWarnings("serial")
public class EditoraMediator extends AbstractMediator<Editora> {

	private EditoraDAO dao;

	public List<Editora> consultarTodas() {
		return dao.listar();
	}

	@Override
	protected void validarInclusao(Editora editora) throws NegocioException {
		super.validarInclusao(editora);
		validarCamposObrigatorios(editora);
	}

	private Integer obterProximoId() {
		Integer retorno = dao.obterIdAtual();
		if (retorno == null) {
			retorno = 1;
		} else {
			retorno++;
		}
		return retorno;
	}

	@Transactional(isolation = Isolation.DEFAULT, rollbackFor = Exception.class)
	public void salvar(Editora editora) {
		validarInclusao(editora);
		editora.setIdEditora(obterProximoId());
		dao.salvar(editora);
	}

	private void validarCamposObrigatorios(Editora editora) {
		List<Mensagem> mensagens = editora.validar();

		if (editora.getNome() != null && StringUtils.isBlank(editora.getNome())) {
			mensagens.add(new Mensagem(
					ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO, "Nome"));
		}

		if (editora.getEmail() != null
				&& StringUtils.isBlank(editora.getEmail())) {
			mensagens.add(new Mensagem(
					ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO, "E-mail"));
		}

		if (editora.getCnpj() != null && StringUtils.isBlank(editora.getCnpj())) {
			mensagens.add(new Mensagem(
					ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO, "CNPJ"));
		}

		if (editora.getEndereco() != null
				&& StringUtils.isBlank(editora.getEndereco())) {
			mensagens
					.add(new Mensagem(
							ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO,
							"Endereço"));
		}

		if (editora.getRazaoSocial() != null
				&& StringUtils.isBlank(editora.getRazaoSocial())) {
			mensagens.add(new Mensagem(
					ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO,
					"Razão Social"));
		}

		if (editora.getTelefone() != null
				&& StringUtils.isBlank(editora.getTelefone())) {
			mensagens
					.add(new Mensagem(
							ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO,
							"Telefone"));
		}

		if (!mensagens.isEmpty()) {
			throw new NegocioException(mensagens);
		}
	}

	public Editora buscar(Integer idEditora) {
		return dao.buscar(idEditora);
	}

	@Override
	protected EditoraDAO getDao() {
		return dao;
	}

	public void setDao(EditoraDAO dao) {
		this.dao = dao;
	}

}
